package loja.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import loja.dao.exceptions.BuscaException;
import loja.dao.exceptions.ImpossivelAtualizarException;
import loja.dao.exceptions.ImpossivelCriarException;
import loja.dao.exceptions.ImpossivelDeletarException;
import loja.dominio.Marca;

/**
 *
 * @author Rodrigo
 */
public class MarcaDao extends AbstractGenericDao<Marca> {

    public MarcaDao() {
    }

    @Override
    public void criar(Marca marca) throws ImpossivelCriarException {
        String sql = "insert into marca(marca) values (?)";
        PreparedStatement stmt = null;
        try {

            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setString(1, marca.getMarca());
            stmt.execute();
            comitarTransacao();
            JOptionPane.showMessageDialog(null, "Registro salvo com SUCESSO!!!");
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelCriarException("Não foi possível criar um nova marca.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public void atualizar(Marca marca) throws ImpossivelAtualizarException {
        String sql = "update marca set marca=? where idmarca=?";
        PreparedStatement stmt = null;
        try {
            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setString(1, marca.getMarca());
            stmt.setLong(2, marca.getId());
            // Executa o código sql
            stmt.execute();
            comitarTransacao();
            JOptionPane.showMessageDialog(null, "Registro alterado com SUCESSO!!!");
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelAtualizarException("Não foi possível atualizar a marca.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public void deletar(Marca marca) throws ImpossivelDeletarException {
        String sql = "delete from marca where idmarca=?";
        PreparedStatement stmt = null;
        try {
            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, marca.getId());
            stmt.execute();
            comitarTransacao();
            JOptionPane.showMessageDialog(null, "Registro Excluido com SUCESSO!!!");
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelDeletarException("Não foi possível atualizar a marca.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public Marca buscar(Long id) throws BuscaException {
        String sql = "select * from marca where idmarca=?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Marca marca = null;
        try {
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, id);
            rs = stmt.executeQuery();
            while (rs.next()) {
                marca = construirMarca(rs);
            }

        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar a marca.");
        }
        return marca;
    }

    @Override
    public List<Marca> buscarTodos() throws BuscaException {
        String sql = "select * from marca";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Marca> marcas = null;
        Marca marca = null;
        try {
            stmt = getConexao().prepareStatement(sql);
            rs = stmt.executeQuery();
            marcas = new ArrayList<Marca>();
            while (rs.next()) {
                marca = construirMarca(rs);
                marcas.add(marca);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar as marcas.");
        }
        return marcas;
    }

    public List<Marca> buscarPorDescricao(String descricao) throws BuscaException {
        String sql = "select * from marca where marca like ?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Marca> marcas = null;
        Marca marca = null;
        try {
            stmt = getConexao().prepareStatement(sql);
            stmt.setString(1, "%" + descricao + "%");
            rs = stmt.executeQuery();
            marcas = new ArrayList<Marca>();

            while (rs.next()) {
                marca = construirMarca(rs);
                marcas.add(marca);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar as Marcas.");
        }
        return marcas;
    }

    @Override
    public long contar() throws BuscaException {
        String sql = "select count(*) from marca";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Long total = null;

        try {
            stmt = getConexao().prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                total = rs.getLong(1);
            }

        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível contar a marca.");
        }
        return total;
    }

    private Marca construirMarca(ResultSet rs) throws SQLException {
        Marca marca = new Marca();
        marca.setId(rs.getLong("idmarca"));
        marca.setMarca(rs.getString("marca"));

        return marca;

    }
}
